-- Versie 2.0 (werkend na de demo)
-- Deze versie kan het ID-RAM en het Sprite-RAM weergeven op het beeld en kan input ontvangen via een schakelaar
-- 03-02-2012

-- Dit is de file voor de koppeling tussen de verschillende delen.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.vgapack.all; -- Zorgt voor de vga timing, klok delen en latch aan de uitgang
use work.calcpack.all; -- Zorgt voor de aansturing van het ram
use work.ram_pack.all; -- De RAM geheugens zelf
use work.RAM_BG.all; --achtergrond ram
--use work.movpack.all; -- De (tijdelijk) schakelaar voor input van user
use work.serial_in_package.all; --  de complete uart package

entity koppeling is
PORT(	clock : in std_logic; -- 50 MHz klok ingang
--		schak : in std_logic; -- (tijdelijke) schakelaar voor input van user
		vsync, hsync : out std_logic; -- vsync en hsync voor VGA
		RGB_uitgang : out std_logic_vector(2 downto 0); --- RGB uitgang voor VGA
		serial_inputD7 : in std_logic; -- input voor uart
		serial_inputDB9 :in std_logic);
end koppeling;

architecture structural of koppeling is

	-- De volgende signals zorgen voor de koppeling tussen de verschillende onderdelen
	
	-- Signals vanaf de VGA timing
	signal x_teller, y_teller : integer range 0 to 1023; 
	signal clock2 : std_logic;
	signal video_on : std_logic;
	-- Signals voor ID-RAM
	signal read_dataid : std_logic_vector(5 downto 0);
	signal read_addrid : std_logic_vector(7 downto 0);
	signal write_dataid : std_logic_vector(5 downto 0);
	signal write_addrid : std_logic_vector(7 downto 0);
	signal write_en_id : std_logic;
	-- Signals voor Data-RAM
	signal read_addrspr : std_logic_vector(11 downto 0);
	signal read_dataspr : std_logic_vector(2 downto 0);
	-- signals voor spite geldig
	signal sprite_on_sig : std_logic;
	-- signal voor background
	signal rgb_background_sig : std_logic_vector(2 downto 0);-- := "000";
	signal sig_bg_data: std_logic;
	
	signal serial_input_sig : std_logic;
	
begin

	-- De klokdeler zorgt dat de 50MHz klok een 25 MHz klok wordt
	IC1: klokdeler PORT MAP(
		clock => clock,
		clock2 => clock2 );
		
	-- De vga_timing doet wat de naam zegt, alle timingseisen voor VGA
	IC2: VGA_timing PORT MAP(
		clock2 => clock2,
		hsync => hsync,
		vsync => vsync,
		video_on => video_on,
		x_tellerout => x_teller,
		y_tellerout => y_teller );
		
	-- De latch aan de uitgang om te zorgen dat R, G en B precies tegelijk aan de uitgang staan			
	IC3: latch PORT MAP(
		rgb_uitgang => rgb_uitgang,
		rgb_ingang => read_dataspr,
		rgb_background => rgb_background_sig,
		sprite_on => sprite_on_sig,
		clock2 => clock2,
		video_on => video_on );
		
	-- Het deel wat de aansturing voor het RAM berekend							
	IC4: calcul PORT MAP(
		x_teller => x_teller,
		y_teller => y_teller,
		read_dataid => read_dataid,
		read_addrid => read_addrid,
		read_addrspr => read_addrspr,
		sprite_on => sprite_on_sig);
		
--	-- De (tijdelijke) schakelaar voor user input								
--	IC5: mov PORT MAP(
--		schak => schak,
--		write_addrid => write_addrid,
--		write_dataid => write_dataid );
		
	-- Het RAM wat de id bevat, write_en is tijdelijk altijd 1.
	-- In dit RAM wordt uiteindelijk geschreven met de koppeling.
	IC6: ram_idarray PORT MAP(
		Clk => clock,
		Write_En => write_en_id,
		Write_ADDR => write_addrid,
		Read_ADDR => read_addrid,
		Write_DATA => write_dataid,
		Read_DATA => read_dataid );	
		
	-- Het RAM wat de sprites bevat, deze is (tot nu toe) hardcoded dus write = 0.
	IC7: ram_sprite PORT MAP(
		Clk => clock,
		Write_En => '0',
		Write_ADDR => (others => '0'),
		Read_ADDR => read_addrspr,
		Write_DATA => (others => '0'),
		Read_DATA => read_dataspr );
		
	IC8: serial_in PORT MAP(
		serial_input => serial_input_sig,
		clk_50MHz => clock,
		ID_RAMDATA => write_dataid,
		ID_RAMADDR => write_addrid,
		ID_RAMENWR => write_en_id,
		baud_clk => open
	);
	
--	IC9: ram_background Port map ( 
--		Clk : clock, --in std_logic; 
--		Write_En : '0',--in std_logic 
--		Write_ADDR : (others=>'0'),--)in std_logic_vector(16 downto 0); 
--		Read_ADDR : --in std_logic_vector(16 downto 0); 
--		Write_DATA : --in std_logic; 
--		Read_DATA : --out std_logic); 
		
	IC10: RAM_2400x32 PORT MAP(
		R_W => '0',
		klok => clock,
		--X_in => x_teller,
		--Y_in => y_teller,
		x_teller => x_teller,
		y_teller => y_teller,
		DATA_in => (others => '0'),
		DATA_out => sig_bg_data
	);
		
rgb_background_sig <= sig_bg_data & sig_bg_data & sig_bg_data;
		
		serial_input_sig <= serial_inputD7; --serial_inputD7;-- serial_inputDB9;
end structural;

